#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
// #include "wifi_manager.h"
#include "wifi_station.h"
#include "tcp_client.h"

#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"

// 确保包含 CMSIS-RTOS2 和 OpenHarmony 初始化头文件
#include "cmsis_os2.h"
#include "ohos_init.h"

#include <string.h>
#include <errno.h>

static const char *TAG = "WIFI_STATION";

// WiFi配置
#define WIFI_SSID "XQ-TEST"
#define WIFI_PASSWORD "12345678"

// TCP服务器配置 - 不再需要硬编码IP地址
#define TCP_SERVER_PORT 8080 // TCP服务器端口

// // WiFi状态变化回调
// void wifi_status_callback(wifi_status_t status)
// {
//     switch (status) {
//         case WIFI_CONNECTING:
//             printf("[WiFi] Connecting to %s...\n", WIFI_SSID);
//             break;

//         case WIFI_CONNECTED: {
//             printf("[WiFi] Connected! IP: %s\n", wifi_manager_get_ip());

//             // 获取网关IP地址作为服务器IP
//             const char *gw_ip = wifi_manager_get_gw_ip();
//             if (gw_ip && strlen(gw_ip) > 0) {
//                 ESP_LOGI(TAG, "Gateway IP: %s", gw_ip);
//                 printf("[WiFi] Gateway IP: %s\n", gw_ip);
//             } else {
//                 ESP_LOGW(TAG, "Failed to get gateway IP");
//                 return;
//             }

//             // 使用网关IP和端口号初始化TCP客户端
//             tcp_client_init(gw_ip, TCP_SERVER_PORT);
//             tcp_client_start();
//             break;
//         }

//         case WIFI_DISCONNECTED:
//             printf("[WiFi] Disconnected\n");
//             // WiFi断开时停止TCP客户端
//             tcp_client_stop();
//             break;

//         case WIFI_CONNECTION_FAILED:
//             printf("[WiFi] Connection failed\n");
//             break;
//     }
// }

// void WifiStationTask(void)
// {
//     esp_log_level_set("*", ESP_LOG_VERBOSE);

//     ESP_LOGI(TAG, "Starting WiFi station task");

//     // 初始化WiFi管理器
//     wifi_manager_init(WIFI_SSID, WIFI_PASSWORD);

//     // 注册WiFi状态回调
//     wifi_manager_register_callback(wifi_status_callback);

//     // 启动WiFi连接
//     wifi_manager_start();

//     //拉起串口线程
//     StartUartTask();

//     // 主循环get_question_result_flag
//     while (1) {

//         // 检查WiFi状态
//         wifi_status_t status = wifi_manager_get_status();

//         // 如果WiFi断开，尝试重新连接
//         if (status == WIFI_DISCONNECTED) {
//             ESP_LOGW(TAG, "WiFi disconnected, attempting to reconnect...");
//             wifi_manager_start();
//         }

//         // 示例：处理答题结果并发送,暂时屏蔽
//         if (status == WIFI_CONNECTED && tcp_is_connected()) {
//             // 在主循环中调用处理答题结果
//             process_question_result();
//         }

//         // 等待100毫秒
//         vTaskDelay(pdMS_TO_TICKS(100));
//     }
// }

void WifiStationTask(void)
{
    // 初始化日志系统（根据实际平台添加）
    // utils_log_init();

    printf("Starting Wi-Fi Station Monitoring...\n");

    // 拉起串口线程与
    StartUartTask();

    while (1)
    {
        // 获取当前Wi-Fi状态
        WIFI_STATUS status = GetWifiStatus();

        switch (status)
        {
        case WIFI_STATE_DISCONNECTED:
            printf("Wi-Fi is DISCONNECTED! Attempting to reconnect...\n");
            tcp_client_stop();

            // 尝试连接到目标Wi-Fi
            if (ConnectToAP(WIFI_SSID, WIFI_PASSWORD) != 0)
            {
                printf("Reconnection failed. Retrying in 10 seconds...\n");
                sleep(10);
            }
            else
            {
                printf("Reconnection initiated successfully.\n");
            }
            break;
#include "esp_netif.h" // 引入网络接口头文件

        case WIFI_STATE_CONNECTED:
            if (IsWifiConnect())
            {
                // 获取本机IP地址（二进制方式）
                esp_netif_ip_info_t ip_info;
                esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"), &ip_info);

                // 转换并打印本机IP
                printf("Device IP: %s\n", ip4addr_ntoa(&ip_info.ip));

                // 获取并打印网关IP（从DHCP获取）
                printf("Access Point IP: %s\n", ip4addr_ntoa(&ip_info.gw));

                // 使用网关IP连接服务器
                char gateway_ip_str[16] = {0};
                strcpy(gateway_ip_str, ip4addr_ntoa(&ip_info.gw));

                if (!tcp_is_connected())
                {
                    printf("WifiStationTask-tcp_client_start\n");
                    tcp_client_start(gateway_ip_str, TCP_SERVER_PORT);
                }

                if (tcp_is_connected())
                {
                    process_question_result();
                }
            }
            else
            {
                printf("Wi-Fi is connected but no IP address assigned\n");
            }
            break;
        case WIFI_STATE_INIT:
        default:
            printf("Initializing Wi-Fi connection...\n");
            // 首次连接
            if (ConnectToAP(WIFI_SSID, WIFI_PASSWORD) != 0)
            {
                printf("Initial connection failed. Retrying...\n");
            }
            break;
        }

        // 检查是否自动切换到更好的AP
        // (这个功能是智能切换同名AP，不需要参数)
        // ConnectBestWifi(TARGET_SSID, TARGET_PASSWORD);

        // 休眠5秒后再次检查
        sleep(5);
    }

    // return 0;
}

// OpenHarmony入口函数
void WifiStationDemo(void)
{
    // 使用CMSIS-RTOS2的线程属性结构体
    osThreadAttr_t attr;
    attr.name = "WIFI_STATION_TASK";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 10240;
    attr.priority = osPriorityNormal; // 使用CMSIS定义优先级，这里使用普通优先级

    // 创建线程
    if (osThreadNew((osThreadFunc_t)WifiStationTask, NULL, &attr) == NULL)
    {
        ESP_LOGE(TAG, "Failed to create WiFi station task");
    }
    else
    {
        ESP_LOGI(TAG, "WiFi station task created");
    }
}
APP_FEATURE_INIT(WifiStationDemo);